home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / oviewer.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  6KB  |  287 lines

  1. /* --------------------------------- oviewer.c ------------------------------ */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* The special 'viewer' object is used in the external view modes.
  8. */
  9.  
  10. #include "plane.h"
  11.  
  12.  
  13. static SHAPE shape_vwr = {
  14.     0,
  15.     0,
  16.     0,
  17.     1L,        /* weight */
  18.     0        /* drag */
  19. };
  20.  
  21. LOCAL_FUNC int FAR
  22. create_vwr (OBJECT *p)
  23. {
  24.     if (!CV)
  25.         return (1);
  26.  
  27.     p->color = CC_WHITE;
  28.     p->time = FOREVER;
  29.     p->owner = CV;
  30.     p->ownerid = CV->id;
  31.  
  32.     Vcopy (p->a, CV->a);
  33.     Mcopy (p->T, CV->T);
  34.     LVcopy (p->R, CV->R);
  35.     return (0);
  36. }
  37.  
  38. LOCAL_FUNC void FAR
  39. dynamics_vwr (OBJECT *p, int interval)
  40. {
  41.     OBJECT        *owner, *target;
  42.     int        mode, f;
  43.     long        t;
  44.     ANGLE        a;
  45.     VECT        V, V1;
  46.     AVECT        da;
  47.     MAT        M;
  48.     LVECT        *R;
  49.     VIEWPORT    *ovp;
  50.  
  51.     if ((owner = p->owner) != CV || owner->id != CV->id) {
  52.         owner = CV;
  53.         p->owner = CV;
  54.         p->ownerid = CV->id;
  55.         Vcopy (p->a, CV->a);
  56.         Mcopy (p->T, CV->T);
  57.         LVcopy (p->R, CV->R);
  58.     }
  59.     if (!(ovp = owner->viewport))
  60.         ovp = CP;
  61.  
  62.     p->viewport->flags &= ~VF_MIRROR;
  63.  
  64.     mode = p->misc[0];
  65.     switch (mode) {
  66.     case HDT_MAP:                    /* map */
  67.     case HDT_RADAR:                    /* new map */
  68.         p->R[X] = owner->R[X];
  69.         p->R[Y] = owner->R[Y];
  70.         p->R[Z] = 48000L*VONE;
  71.         p->a[X] = -D90;
  72.         p->a[Y] = 0;
  73.         if (HDT_RADAR == mode)
  74.             p->a[Z] = owner->a[Z];
  75.         else
  76.             p->a[Z] = 0;
  77.  
  78.         Mobj (p);
  79.         break;
  80.     case HDT_GAZE:
  81.         f = COS(CP->rotx);
  82.         f = fmul (f, 50*VONE);
  83.         t = owner->R[X] - fmul (f, SIN(CP->rotz));
  84.         p->R[X] += (t - p->R[X])/1;
  85.  
  86.         t = owner->R[Y] - fmul (f, COS(CP->rotz));
  87.         p->R[Y] += (t - p->R[Y])/1;
  88.  
  89.         f = SIN(CP->rotx);
  90.         f = fmul (f, 50*VONE);
  91.         t = owner->R[Z] + f;
  92.         p->R[Z] += (t - p->R[Z])/1;
  93.  
  94.         p->a[X] = 0;
  95.         p->a[Y] = 0;
  96.         p->a[Z] = 0;
  97.  
  98.         Mident (p->T);
  99.         break;
  100.     case HDT_CHASE:                    /* chase orig */
  101.     case HDT_FOLLOW:                /* chase orig, Y=0 */
  102.         f = 50*VONE + muldiv (owner->speed, 500*VONE, VMAX);
  103.         if (owner->speed)
  104.             Vmuldiv (V, owner->V, f, owner->speed);
  105.         else
  106.             Vscale (V, owner->T[Y], f);
  107.         Vsub (p->R, owner->R, V);
  108.  
  109.         p->a[X] += (owner->a[X] - p->a[X])/4;
  110.         if (HDT_CHASE == mode)
  111.             p->a[Y] += (owner->a[Y] - p->a[Y])/8;
  112.         else
  113.             p->a[Y] = 0;
  114.         p->a[Z] += (owner->a[Z] - p->a[Z])/4;
  115.         Mobj (p);
  116.         break;
  117.     case HDT_TARGET:            /* focus on target */
  118.     case HDT_PAN:                /* panning target */
  119.         LVcopy (p->R, owner->R);
  120.         Vcopy (p->V, owner->V);
  121.         p->da[X] = p->da[Y] = p->da[Z] = 0;
  122.         f = IS_PLANE (owner);
  123.         if (f && T(target = EE(owner)->target) &&
  124.                         target->id == EE(owner)->tid)
  125.             R = &target->R;
  126.         else if (f && (EE(owner)->hud2 & HUD_ILS))
  127.             R = &ils[EE(owner)->ils-1].R;
  128.         else {
  129. #if 0
  130.             Vcopy (p->a, owner->a);
  131.             Mcopy (p->T, owner->T);
  132.             break;
  133. #else
  134.             if (owner->speed) {
  135.                 V[X] = fdiv (owner->V[X], owner->speed);
  136.                 V[Y] = fdiv (owner->V[Y], owner->speed);
  137.                 V[Z] = fdiv (owner->V[Z], owner->speed);
  138.                 goto lll1;
  139.             } else {
  140.                 Vcopy (p->a, owner->a);
  141.                 Mcopy (p->T, owner->T);
  142.                 break;
  143.             }
  144. #endif
  145.         }
  146.         V[X] = (int)(((*R)[X] - owner->R[X])/VONE);
  147.         V[Y] = (int)(((*R)[Y] - owner->R[Y])/VONE);
  148.         V[Z] = (int)(((*R)[Z] - owner->R[Z])/VONE);
  149. lll1:
  150.         if (HDT_PAN == mode) {
  151. #if 1
  152.             VxMmul (V1, V, p->T);
  153.  
  154.             f = TADJ (VD180)*VONE;
  155.             a = ATAN (V1[Z], V1[Y]);
  156.             if (a > f)
  157.                 da[X] = f;
  158.             else if (a < -f)
  159.                 da[X] = -f;
  160.             else
  161.                 da[X] = a;
  162.             a = -ATAN (V1[X], V1[Y]);
  163.             if (a > f)
  164.                 da[Z] = f;
  165.             else if (a < -f)
  166.                 da[Z] = -f;
  167.             else
  168.                 da[Z] = a;
  169.             da[Y] = 0;
  170.  
  171.             Myxz (M, da);
  172.             Mmul (M, p->T);
  173.             Mangles (0, M, p->a, da[Y]);
  174.             p->a[Y] = 0;
  175. #endif
  176. #if 0
  177.             dampen (&p->a[Z], -ATAN (V[X], V[Y]), 4);
  178.             f = ihypot2d (V[X], V[Y]);
  179.             dampen (&p->a[X], ATAN (V[Z], f), 4);
  180.             p->a[Y] = 0;
  181. #endif
  182. #if 0
  183.             i = p->a[Z];
  184.             dampen (&i, -ATAN (V[X], V[Y]), 4);
  185.             p->a[Z] = i;
  186.  
  187.             f = ihypot2d (V[X], V[Y]);
  188.             i = p->a[X];
  189.             dampen (&i, ATAN (V[Z], f), 4);
  190.             p->a[X] = i;
  191.  
  192.             if (iabs(p->a[X]) > D90) {
  193.                 p->a[X] = D180 - p->a[X];
  194.                 p->a[Z] = D180 + p->a[Z];
  195.             }
  196.             p->a[Y] = 0;
  197. #endif
  198. #if 0
  199.             da[X] = TADJ(owner->da[X])*VONE;
  200.             da[Y] = TADJ(owner->da[Y])*VONE;
  201.             da[Z] = TADJ(owner->da[Z])*VONE;
  202.             Myxz (M, da);
  203.             Mmul (M, p->T);
  204.             Mangles (0, M, p->a, da[Y]);
  205.  
  206.             i = p->a[Z];
  207.             dampen (&i, -ATAN (V[X], V[Y]), 4);
  208.             p->a[Z] = i;
  209.             f = ihypot2d (V[X], V[Y]);
  210.             i = p->a[X];
  211.             dampen (&i, ATAN (V[Z], f), 4);
  212.             p->a[X] = i;
  213.             if (iabs(p->a[X]) > D90) {
  214.                 p->a[X] = D180 - p->a[X];
  215.                 p->a[Y] = D180 + p->a[Y];
  216.             }
  217.             i = p->a[Y];
  218.             dampen (&i, 0, 4);
  219.             p->a[Y] = i;
  220. #endif
  221.         } else {
  222.             p->a[Z] = -ATAN (V[X], V[Y]);
  223.             f = ihypot2d (V[X], V[Y]);
  224.             p->a[X] = ATAN (V[Z], f);
  225.             p->a[Y] = 0;
  226.         }
  227.         Mobj (p);
  228.         break;
  229.     case HDT_MIRROR:
  230.         p->viewport->flags |= VF_MIRROR;
  231.     case HDT_REAR:
  232. #if 0
  233.         Vcopy (p->a, owner->a);
  234.         Mcopy (p->T, owner->T);
  235.         LVcopy (p->R, owner->R);
  236.         p->viewport->rotz = D180;
  237. #else
  238.         LVcopy (p->R, owner->R);
  239.         p->a[X] = -owner->a[X];
  240.         p->a[Y] = -owner->a[Y];
  241.         p->a[Z] = D180+owner->a[Z];
  242.         Mobj (p);
  243. #endif
  244.         break;
  245.     case HDT_RIGHT:
  246.     case HDT_LEFT:
  247.         if (p->viewport->zoom != ovp->zoom)
  248.             zoom (p->viewport, ovp->zoom-p->viewport->zoom);
  249.         a = ATAN (ovp->maxx, ovp->z);
  250.         if (HDT_RIGHT == mode)
  251.             p->viewport->rotz = ovp->rotz + 2*a;
  252.         else
  253.             p->viewport->rotz = ovp->rotz - 2*a;
  254.         goto def_case;
  255.     case HDT_FRONT:
  256.     default:
  257. def_case:
  258.         Vcopy (p->a, owner->a);
  259.         p->sinx = owner->sinx;
  260.         p->cosx = owner->cosx;
  261.         p->siny = owner->siny;
  262.         p->cosy = owner->cosy;
  263.         p->sinz = owner->sinz;
  264.         p->cosz = owner->cosz;
  265.         Mcopy (p->T, owner->T);
  266.         LVcopy (p->R, owner->R);
  267.         break;
  268.     }
  269. /* No need to update.
  270.  *
  271.  * object_update (p, interval);
  272. */
  273. }
  274.  
  275. BODY FAR BoViewer = {
  276.     0,
  277.     0,
  278.     "VIEWER",
  279.     &shape_vwr,
  280.     gen_read,
  281.     gen_term,
  282.     create_vwr,
  283.     gen_delete,
  284.     dynamics_vwr,
  285.     gen_hit
  286. };
  287.